home *** CD-ROM | disk | FTP | other *** search
/ SGI Hot Mix 17 / Hot Mix 17.iso / HM17_SGI / research / examples / demo / demosrc / d_plot2d.pro < prev    next >
Text File  |  1997-07-08  |  36KB  |  993 lines

  1. ;$Id: d_plot2d.pro,v 1.14 1997/04/20 23:13:05 tremblay Exp $
  2. ;
  3. ;  Copyright (c) 1997, Research Systems, Inc. All rights reserved.
  4. ;       Unauthorized reproduction prohibited.
  5. ;
  6. ;+
  7. ;  FILE:
  8. ;       d_plot2d.pro
  9. ;
  10. ;  CALLING SEQUENCE: d_plot2d
  11. ;
  12. ;  PURPOSE:
  13. ;       This example demonstrates few features of a 2-D plot.
  14. ;
  15. ;  MAJOR TOPICS: Plotting
  16. ;
  17. ;  CATEGORY:
  18. ;       IDL 5.0
  19. ;
  20. ;  INTERNAL FUNCTIONS and PROCEDURES:
  21. ;       pro p2d_makeLine                -  Make a line plot
  22. ;       pro p2d_makeSymbol              -  Make a plot with symbols
  23. ;       pro p2d_makeBar                 -  Make a histogram plot (bar) 
  24. ;       pro p2d_makePolar               -  Make a polar plot 
  25. ;       pro p2d_makeLogLog              -  Make a log-log plot 
  26. ;       pro p2d_makeSemiLog             -  Make a semi-log plot 
  27. ;       pro D_Plot2d_Event            -  Event handler
  28. ;       pro D_Plot2d_Cleanup          -  Cleanup
  29. ;       pro D_Plot2d                  -  Main procedure
  30. ;
  31. ;  EXTERNAL FUNCTIONS, PROCEDURES, and FILES:
  32. ;       pro gettips                 -  Get the tip text structure.
  33. ;       pro widtips                 -  Create the widget text for tips.
  34. ;       pro sizetips                -  Size the widget text for tips.
  35. ;       pro puttips                 -  Change the tip text.
  36. ;       plot2d.txt
  37. ;       plot2d.tip
  38. ;
  39. ;  REFERENCE: IDL Reference Guide, IDL User's Guide
  40. ;
  41. ;  NAMED STRUCTURES:
  42. ;       none.
  43. ;
  44. ;  COMMON BLOCS:
  45. ;       none.
  46. ;
  47. ;  MODIFICATION HISTORY:
  48. ;       95,   Dan Carr   - Written.
  49. ;       11/95,   DAT     - Modified for IDL 5.0 demo
  50. ;-
  51. ;--------------------------------------------------------------------
  52. ;
  53. ;   PURPOSE  Create a line plot 
  54. ;
  55. pro p2d_MakeLine, $
  56.     WindowID, $     ; IN: window Identifier
  57.     periods         ; IN: period of the damped sine wave
  58.     
  59.     WSET, windowID
  60.     x = Float(periods) * 2.0 * !PI * Findgen(400) / 399.0
  61.     y = 4.0 * !PI * Sin(x) / (x + 1.0)
  62.     PLOT, x, y, YRANGE=[-3.0, 6.0], XSTYLE=1, YSTYLE=1, TICKLEN=(1.0), $
  63.         BACKGROUND=0, COLOR=8, TITLE="DAMPED SINE WAVE", /NODATA, $
  64.         YTITLE='Y',  XTITLE='X', $
  65.         POSITION=[0.15, 0.25, 0.9, 0.75]
  66.     OPLOT, x, y, THICK=3, COLOR=3
  67.     Empty
  68.  
  69.     
  70. end     ;  of p2d_MakeLine
  71.  
  72. ;--------------------------------------------------------------------
  73. ;
  74. ;   PURPOSE  Create a scatter plot with symbols 
  75. ;
  76. pro p2d_MakeSymbol, $
  77.     WindowID, $     ; IN: window Identifier
  78.     Variance, $     ; IN: vdata variance
  79.     symbol, $       ; IN: symbol integer identifier
  80.     X=x, $          ; OUT: x data
  81.     Y=y             ; OUT: y data
  82.     
  83.     symbolSize = 1.5
  84.     if (symbol eq 3) then begin
  85.         symbolSize = 50.0
  86.     endif
  87.     WSET, windowID
  88.     if (N_ELEMENTS(x) eq 0) then begin
  89.         x = FLTARR(40)
  90.         x = FINDGEN(40)
  91.         y = SIN( !pi * 2.0 * x/10.0) + RANDOMN(Seed, 40)* variance
  92.     endif else if (x(1) eq 0.0) then begin
  93.         x = FLTARR(40)
  94.         x = FINDGEN(40)
  95.         y = SIN( !pi * 2.0 * x/10.0) + RANDOMN(Seed, 40)* variance
  96.     endif
  97.  
  98.     PLOT, x, y, XTITLE='X', YTITLE='Y', $
  99.         PSYM=symbol, $
  100.         YSTYLE=1, YRANGE=[-4, 4], $
  101.         TITLE='Scatter plot with symbols', /NODATA, COLOR=3
  102.         
  103.     PLOT, x, y, XTITLE='X', YTITLE='Y', $
  104.         PSYM=symbol, $
  105.         XSTYLE=4, YSTYLE=5, YRANGE=[-4, 4], $
  106.         THICK=2.0, $
  107.         COLOR=5, /NOERASE, SYMSIZE=symbolSize
  108.     
  109. end     ;  of p2d_MakeSymbol
  110.  
  111. ;--------------------------------------------------------------------
  112. ;
  113. ;   PURPOSE  Create a bar plot  
  114. ;
  115. pro p2d_MakeBar, $
  116.     WindowID, $     ; IN: window Identifier
  117.     Variance        ; IN: vdata variance
  118.     
  119.     WSET, windowID
  120.     x = FLTARR(40)
  121.     x = FINDGEN(40)
  122.     y = SIN( !pi * 2.0 * x/12.0) + RANDOMN(Seed, 40)*variance
  123.     PLOT, x, y, XTITLE='X', YTITLE='Y', $
  124.         YSTYLE=1, YRANGE=[-4, 4], $
  125.         TITLE='Bar plot', /NODATA, COLOR=3
  126.         
  127.     PLOT, x, y, XTITLE='X', YTITLE='Y', $
  128.         PSYM=10, $
  129.         XSTYLE=4, YSTYLE=5, YRANGE=[-4, 4], $
  130.         THICK=3.0, $
  131.         COLOR=2, /NOERASE, SYMSIZE=1.5
  132.     
  133. end     ;  of p2d_MakeBar
  134.  
  135. ;--------------------------------------------------------------------
  136. ;
  137. ;   PURPOSE  Create a polar plot  
  138. ;
  139. pro p2d_MakePolar, $
  140.     WindowID, $        ; IN: window Identifier
  141.     COLOR = color, $   ; IN: color index (corresponds to TEK_COLOR)
  142.     RADIUS= radius, $  ; IN: radius array data
  143.     New = new          ; IN:  1: create new data
  144.     
  145.     WSET, windowID
  146.     theta = FINDGEN(41) *!pi / 20.0
  147.     x = FINDGEN(41)
  148.     if (N_ELEMENTS(new) eq 1) then begin
  149.         radius = ABS(SIN( !pi * 2.0 * x/100.0) + RANDOMU(Seed, 41)*2.0)
  150.         radius(40) = radius(0)
  151.     endif
  152.   
  153.     PLOT, /POLAR, radius, theta, TITLE='Polar plot', $
  154.         COLOR=3, /NODATA, $
  155.         XSTYLE=1, YSTYLE=1, $
  156.         XTITLE='X', YTITLE='Y', $
  157.         XRANGE=[-3.0, 3.0], YRANGE=[-3.0, 3.0]
  158.         
  159.     PLOTS, [0.0, 0.0], [-3.0, 3.0], COLOR=3
  160.     PLOTS, [-3.0, 3.0], [0.0, 0.0], COLOR=3
  161.         
  162.     PLOT, /POLAR, radius, theta,  $
  163.         PSYM=-4, $
  164.         THICK=3.0, $
  165.         XTITLE='X', YTITLE='Y', $
  166.         XSTYLE=5, YSTYLE=5, COLOR=color, /NOERASE, $
  167.         XRANGE=[-3.0, 3.0], YRANGE=[-3.0, 3.0]
  168.  
  169. end     ;  of p2d_MakePolar
  170.  
  171. ;--------------------------------------------------------------------
  172. ;
  173. ;   PURPOSE  Create a bar plot  
  174. ;
  175. pro p2d_MakeLogLog, $
  176.     WindowID, $             ; IN: window Identifier
  177.     Thickness= thickness, $ ; IN: window Identifier
  178.     X=x, $                  ; IN/OUT: x data
  179.     Y=y, $                  ; IN/OUT: y data
  180.     New = new               ; IN: if new create new data
  181.     
  182.     WSET, windowID
  183.     x = FLTARR(40)
  184.     z = FINDGEN(40)
  185.     x = EXP( z/5.0)
  186.     if (N_ELEMENTS(new) eq 1) then begin
  187.          y = EXP( (z + RANDOMU(Seed, 40)*6.0) / 10.0)
  188.     endif
  189.     PLOT, x, y, XTITLE='X', YTITLE='Y', /YLOG, /XLOG, $
  190.         TITLE='Log-Log plot', /NODATA, COLOR=3
  191.         
  192.     PLOT, x, y, XTITLE='X', YTITLE='Y', $
  193.         YSTYLE=4, XSTYLE=4, /YLOG, /XLOG, $
  194.         THICK=thickness, $
  195.         COLOR=5, /NOERASE
  196.     
  197. end     ;  of p2d_MakeLogLog
  198.  
  199. ;--------------------------------------------------------------------
  200. ;
  201. ;   PURPOSE  Create a bar plot  
  202. ;
  203. pro p2d_MakeSemiLog, $
  204.     WindowID     ; IN: window Identifier
  205.     
  206.     WSET, windowID
  207.     x = FLTARR(40)
  208.     x = FINDGEN(40)
  209.     y = EXP( (x + RANDOMU(Seed, 40)*6.0) / 10.0)
  210.     PLOT, x, y, XTITLE='X', YTITLE='Y', /YLOG, $
  211.         TITLE='Semi-Log plot', /NODATA, COLOR=3
  212.         
  213.     PLOT, x, y, XTITLE='X', YTITLE='Y', $
  214.         YSTYLE=4, XSTYLE=4, /YLOG, $
  215.         THICK=3.0, $
  216.         COLOR=2, /NOERASE
  217.  
  218. end     ;  of p2d_MakeSemiLog
  219.  
  220.  
  221. ;--------------------------------------------------------------------
  222. ;
  223. ;  PURPOSE   Event handler
  224. ;
  225. pro D_Plot2d_Event, $
  226.     sEvent      ; IN: event structure
  227.  
  228.     WIDGET_CONTROL, sEvent.id, GET_UVALUE=eventUValue
  229.  
  230.     ;  Quit the application using the close box.
  231.     ;
  232.     if (TAG_NAMES(sEvent, /STRUCTURE_NAME) EQ $
  233.         'WIDGET_KILL_REQUEST') then begin
  234.         WIDGET_CONTROL, sEvent.top, /DESTROY
  235.         RETURN
  236.     endif
  237.     
  238.     case eventUValue of
  239.     
  240.         ;  Show the apporpriate plots from the radio button list.
  241.         ;
  242.         'SELECT' : begin
  243.             WIDGET_CONTROL, sEvent.top, GET_UVALUE=sInfo, /NO_COPY
  244.             WSET, sInfo.drawWindowID
  245.             case sEvent.value of
  246.             
  247.                 ;  Show the damped sine curve.
  248.                 ;
  249.                 0 : begin
  250.                     WIDGET_CONTROL, sInfo.currentBase, MAP=0
  251.                     WIDGET_CONTROL, sInfo.wSelectionBase(0), MAP=1
  252.                     WIDGET_CONTROL, sInfo.wGenerateButton, SENSITIVE=0
  253.                     sInfo.currentBase = sInfo.wSelectionBase(0)
  254.  
  255.                     device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, $
  256.                         0, 0, sInfo.pixmapArray(0)]
  257.                     textChange = ['perio']
  258.                     putTips, sInfo.sText, sInfo.wText[1], $
  259.                         textChange, [2]
  260.  
  261.                 end
  262.  
  263.                 ;  Show the symbols plot.
  264.                 ;
  265.                 1 : begin
  266.                     WIDGET_CONTROL, sInfo.currentBase, MAP=0
  267.                     WIDGET_CONTROL, sInfo.wSelectionBase(1), MAP=1
  268.                     WIDGET_CONTROL, sInfo.wGenerateButton, SENSITIVE=1
  269.                     sInfo.currentBase = sInfo.wSelectionBase(1)
  270.                     device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, $
  271.                         0, 0, sInfo.pixmapArray(1)]
  272.                     WIDGET_CONTROL, sInfo.wSymbolSlider, GET_VALUE=variance
  273.                     variance = FLOAT(variance)/5.0
  274.                     symbolString = String(variance, Format='(F3.1)')
  275.                     WIDGET_CONTROL, sInfo.wSymbolLabel, $
  276.                         SET_VALUE=symbolString
  277.                     textChange = ['symbo']
  278.                     putTips, sInfo.sText, sInfo.wText[1], $
  279.                         textChange, [2]
  280.                 end
  281.  
  282.                 ;  Show the bar plot.
  283.                 ;
  284.                 2 : begin
  285.                     WIDGET_CONTROL, sInfo.currentBase, MAP=0
  286.                     WIDGET_CONTROL, sInfo.wSelectionBase(2), MAP=1
  287.                     WIDGET_CONTROL, sInfo.wGenerateButton, SENSITIVE=1
  288.                     sInfo.currentBase = sInfo.wSelectionBase(2)
  289.                     device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, $
  290.                         0, 0, sInfo.pixmapArray(2)]
  291.                     WIDGET_CONTROL, sInfo.wBarSlider, GET_VALUE=variance
  292.                     variance = FLOAT(variance)/5.0
  293.                     barString = String(variance, Format='(F3.1)')
  294.                     WIDGET_CONTROL, sInfo.wBarLabel, $
  295.                         SET_VALUE=barString
  296.                     textChange = ['varia']
  297.                     putTips, sInfo.sText, sInfo.wText[1], $
  298.                         textChange, [2]
  299.                 end
  300.  
  301.                 ;  Show the polar plot (with color selection).
  302.                 ;
  303.                 3 : begin
  304.                     WIDGET_CONTROL, sInfo.currentBase, MAP=0
  305.                     WIDGET_CONTROL, sInfo.wSelectionBase(3), MAP=1
  306.                     WIDGET_CONTROL, sInfo.wGenerateButton, SENSITIVE=1
  307.                     sInfo.currentBase = sInfo.wSelectionBase(3)
  308.                     device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, $
  309.                         0, 0, sInfo.pixmapArray(3)]
  310.                     textChange = ['color']
  311.                     putTips, sInfo.sText, sInfo.wText[1], $
  312.                         textChange, [2]
  313.                 end
  314.  
  315.                 ;  Show the log-log plot (with line thickness selection).
  316.                 ;
  317.                 4 : begin
  318.                     WIDGET_CONTROL, sInfo.currentBase, MAP=0
  319.                     WIDGET_CONTROL, sInfo.wSelectionBase(4), MAP=1
  320.                     WIDGET_CONTROL, sInfo.wGenerateButton, SENSITIVE=1
  321.                     sInfo.currentBase = sInfo.wSelectionBase(4)
  322.                     device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, $
  323.                         0, 0, sInfo.pixmapArray(4)]
  324.                     textChange = ['thick']
  325.                     putTips, sInfo.sText, sInfo.wText[1], $
  326.                         textChange, [2]
  327.                 end
  328.  
  329.                 ;  Show the semi-log plot (with text location selection).
  330.                 ;
  331.                 5 : begin
  332.                     WIDGET_CONTROL, sInfo.currentBase, MAP=0
  333.                     WIDGET_CONTROL, sInfo.wSelectionBase(5), MAP=1
  334.                     WIDGET_CONTROL, sInfo.wGenerateButton, SENSITIVE=1
  335.                     WIDGET_CONTROL, sInfo.wXLocSlider, GET_VALUE=xlocation
  336.                     WIDGET_CONTROL, sInfo.wYLocSlider, GET_VALUE=ylocation
  337.                     xlocation = FLOAT(xlocation)/10.0
  338.                     ylocation = FLOAT(ylocation)/10.0
  339.                     sInfo.currentBase = sInfo.wSelectionBase(5)
  340.                     device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, $
  341.                         0, 0, sInfo.pixmapArray(5)]
  342.                     WSET, sInfo.drawWindowID
  343.                     XYOUTS, xlocation, ylocation, 'TEXT', COLOR=1, /NORMAL
  344.                     textChange = ['locat']
  345.                     putTips, sInfo.sText, sInfo.wText[1], $
  346.                         textChange, [2]
  347.                 end
  348.                     
  349.             endcase
  350.             
  351.             WIDGET_CONTROL, sEvent.top, SET_UVALUE=sInfo, /NO_COPY
  352.             
  353.         end   ;   of  SELECT
  354.         
  355.         ;  Generate a new data set.
  356.         ;
  357.         'GENERATE' : begin
  358.         
  359.             WIDGET_CONTROL, sEvent.top, GET_UVALUE=sInfo, /NO_COPY
  360.             WIDGET_CONTROL, sInfo.wTopBase, SENSITIVE=0
  361.             WIDGET_CONTROL, sInfo.wPeriodSlider, GET_VALUE=period
  362.             WIDGET_CONTROL, sInfo.wSymbolSlider, GET_VALUE=variance
  363.             WIDGET_CONTROL, sInfo.wLogLogSlider, GET_VALUE=thickness
  364.             WIDGET_CONTROL, sInfo.wBarSlider, GET_VALUE=barVariance
  365.             variance = FLOAT(variance)/5.0
  366.             barVariance = FLOAT(barVariance)/5.0
  367.             thickness = FLOAT(thickness)
  368.  
  369.             p2d_makeLine, sInfo.pixmapArray(0), period
  370.  
  371.             symbol = WIDGET_INFO(sInfo.wSymbolList, /LIST_SELECT) + 1
  372.             xdata = sInfo.xdata
  373.             ydata = sInfo.ydata
  374.             xdata(1) = 0.0
  375.             p2d_makeSymbol, sInfo.pixmapArray(1), variance, symbol, $
  376.                 X=xdata, Y=ydata
  377.             sInfo.xdata = xdata
  378.             sInfo.ydata = ydata
  379.  
  380.             p2d_makeBar, sInfo.pixmapArray(2), barVariance
  381.  
  382.             color = WIDGET_INFO(sInfo.wPolarList, /LIST_SELECT) + 1
  383.             p2d_makePolar, sInfo.pixmapArray(3), $
  384.                 COLOR=color, RADIUS=sInfo.radius, /NEW 
  385.  
  386.             x = sInfo.xLogLog
  387.             y = sInfo.yLogLog
  388.             p2d_makeLogLog, sInfo.pixmapArray(4), THICKNESS= thickness, $
  389.                 X=x, Y=y, /NEW
  390.             sInfo.xLogLog = x
  391.             sInfo.yLogLog = y
  392.  
  393.             p2d_makeSemiLog, sInfo.pixmapArray(5)
  394.     
  395.             ;  Redraw the current selection 
  396.             ;
  397.             WIDGET_CONTROL, sInfo.wSelectButton, GET_VALUE=selectValue
  398.             WSET, sInfo.drawWindowID
  399.             Device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, 0, 0, $
  400.                 sInfo.pixmapArray(selectValue)] 
  401.             if (selectValue eq 5) then begin  ; if Semi log, show text
  402.                 WIDGET_CONTROL, sInfo.wXLocSlider, GET_VALUE=xlocation
  403.                 WIDGET_CONTROL, sInfo.wYLocSlider, GET_VALUE=ylocation
  404.                 xlocation = FLOAT(xlocation)/10.0
  405.                 ylocation = FLOAT(ylocation)/10.0
  406.                 WSET, sInfo.drawWindowID
  407.                 XYOUTS, xlocation, ylocation, 'TEXT', COLOR=1, /NORMAL
  408.             endif
  409.                 
  410.             WIDGET_CONTROL, sInfo.wTopBase, SENSITIVE=1
  411.             WIDGET_CONTROL, sEvent.top, SET_UVALUE=sInfo, /NO_COPY
  412.                 
  413.         end   ;   of  GENERATE
  414.         
  415.         ;  Select a new period of the damped sine curve and
  416.         ;  display it.
  417.         ;
  418.         'PERIOD' : begin
  419.             WIDGET_CONTROL, sEvent.top, GET_UVALUE=sInfo, /NO_COPY
  420.             WIDGET_CONTROL, sInfo.wPeriodSlider, GET_VALUE=period
  421.             p2d_makeLine, sInfo.pixmapArray(0), period
  422.             WSET, sInfo.drawWindowID
  423.             Device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, 0, 0, $
  424.                 sInfo.pixmapArray(0)] 
  425.             WIDGET_CONTROL, sEvent.top, SET_UVALUE=sInfo, /NO_COPY
  426.  
  427.         end   ;   of  PERIOD
  428.  
  429.         ;  Redraw the symbol plot with the selected symbol.
  430.         ;
  431.         'SYMBOL' : begin
  432.             WIDGET_CONTROL, sEvent.top, GET_UVALUE=sInfo, /NO_COPY
  433.             WIDGET_CONTROL, sInfo.wSymbolSlider, GET_VALUE=variance
  434.             symbol = WIDGET_INFO(sInfo.wSymbolList, /LIST_SELECT) + 1
  435.             variance = FLOAT(variance)/5.0
  436.             xdata = sInfo.xdata
  437.             ydata = sInfo.ydata
  438.             xdata(1) = 0.0
  439.             p2d_makeSymbol, sInfo.pixmapArray(1), variance, symbol, $
  440.                 X=xdata, Y=ydata
  441.             sInfo.xdata = xdata
  442.             sInfo.ydata = ydata
  443.             WSET, sInfo.drawWindowID
  444.             Device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, 0, 0, $
  445.                 sInfo.pixmapArray(1)] 
  446.             symbolString = String(variance, Format='(F3.1)')
  447.             WIDGET_CONTROL, sInfo.wSymbolLabel, $
  448.                 SET_VALUE=symbolString
  449.             WIDGET_CONTROL, sEvent.top, SET_UVALUE=sInfo, /NO_COPY
  450.  
  451.         end   ;   of  PERIOD
  452.  
  453.         ;  Redraw the symbol plot with the selected symbol.
  454.         ;
  455.         'SYMBOLLIST' : begin
  456.             WIDGET_CONTROL, sEvent.top, GET_UVALUE=sInfo, /NO_COPY
  457.             WIDGET_CONTROL, sInfo.wSymbolSlider, GET_VALUE=variance
  458.             symbol = WIDGET_INFO(sInfo.wSymbolList, /LIST_SELECT) + 1
  459.             variance = FLOAT(variance)/5.0
  460.             xdata = sInfo.xdata
  461.             ydata = sInfo.ydata
  462.             p2d_makeSymbol, sInfo.pixmapArray(1), variance, symbol, $
  463.                 X=xdata, Y=ydata
  464.             WSET, sInfo.drawWindowID
  465.             Device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, 0, 0, $
  466.                 sInfo.pixmapArray(1)] 
  467.             symbolString = String(variance, Format='(F3.1)')
  468.             WIDGET_CONTROL, sInfo.wSymbolLabel, $
  469.                 SET_VALUE=symbolString
  470.             WIDGET_CONTROL, sEvent.top, SET_UVALUE=sInfo, /NO_COPY
  471.  
  472.         end   ;   of  SYMBOLLIST
  473.  
  474.         ;  Redraw the polar plot with the selected color.
  475.         ;
  476.         'POLARLIST' : begin
  477.             WIDGET_CONTROL, sEvent.top, GET_UVALUE=sInfo, /NO_COPY
  478.             color = WIDGET_INFO(sInfo.wPolarList, /LIST_SELECT) + 1
  479.             p2d_makePolar, sInfo.pixmapArray(3), $
  480.                 COLOR=color, RADIUS=sInfo.radius 
  481.             WSET, sInfo.drawWindowID
  482.             Device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, 0, 0, $
  483.                 sInfo.pixmapArray(3)] 
  484.             WIDGET_CONTROL, sEvent.top, SET_UVALUE=sInfo, /NO_COPY
  485.  
  486.         end   ;   of  POLARLIST
  487.  
  488.         ;  Redo the bar (histogram) plot.
  489.         ;
  490.         'BAR' : begin
  491.             WIDGET_CONTROL, sEvent.top, GET_UVALUE=sInfo, /NO_COPY
  492.             WIDGET_CONTROL, sInfo.wBarSlider, GET_VALUE=variance
  493.             variance = FLOAT(variance)/5.0
  494.             p2d_makeBar, sInfo.pixmapArray(2), variance
  495.             WSET, sInfo.drawWindowID
  496.             Device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, 0, 0, $
  497.                 sInfo.pixmapArray(2)] 
  498.             barString = String(variance, Format='(F3.1)')
  499.             WIDGET_CONTROL, sInfo.wBarLabel, $
  500.                 SET_VALUE=barString
  501.             WIDGET_CONTROL, sEvent.top, SET_UVALUE=sInfo, /NO_COPY
  502.  
  503.         end   ;   of  BAR
  504.  
  505.         ;  Redraw the log-log plot with the selected line thickness.
  506.         ;
  507.         'THICKNESS' : begin
  508.             WIDGET_CONTROL, sEvent.top, GET_UVALUE=sInfo, /NO_COPY
  509.             WIDGET_CONTROL, sInfo.wLogLogSlider, GET_VALUE=thickness
  510.             thickness = FLOAT(thickness)
  511.             x = sInfo.xLogLog
  512.             y = sInfo.yLogLog
  513.             p2d_makeLogLog, sInfo.pixmapArray(4), THICKNESS= thickness, $
  514.                 X=x, Y=y
  515.             WSET, sInfo.drawWindowID
  516.             Device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, 0, 0, $
  517.                 sInfo.pixmapArray(4)] 
  518.             WIDGET_CONTROL, sEvent.top, SET_UVALUE=sInfo, /NO_COPY
  519.  
  520.         end   ;   of  THICKNESS
  521.  
  522.       
  523.         ;  Redraw the semi-log plot with the selected text
  524.         ;  x location.
  525.         ;
  526.         'XLOCATION' : begin
  527.             WIDGET_CONTROL, sEvent.top, GET_UVALUE=sInfo, /NO_COPY
  528.             WIDGET_CONTROL, sInfo.wXLocSlider, GET_VALUE=xlocation
  529.             WIDGET_CONTROL, sInfo.wYLocSlider, GET_VALUE=ylocation
  530.             xlocation = FLOAT(xlocation)/10.0
  531.             ylocation = FLOAT(ylocation)/10.0
  532.             WSET, sInfo.drawWindowID
  533.             Device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, 0, 0, $
  534.                 sInfo.pixmapArray(5)] 
  535.             WSET, sInfo.drawWindowID
  536.             XYOUTS, xlocation, ylocation, 'TEXT', COLOR=1, /NORMAL
  537.             WIDGET_CONTROL, sEvent.top, SET_UVALUE=sInfo, /NO_COPY
  538.  
  539.         end   ;   of  XLOCATION
  540.  
  541.         ;  Redraw the semi-log plot with the selected text
  542.         ;  y location.
  543.         ;
  544.         'YLOCATION' : begin
  545.             WIDGET_CONTROL, sEvent.top, GET_UVALUE=sInfo, /NO_COPY
  546.             WIDGET_CONTROL, sInfo.wXLocSlider, GET_VALUE=xlocation
  547.             WIDGET_CONTROL, sInfo.wYLocSlider, GET_VALUE=ylocation
  548.             xlocation = FLOAT(xlocation)/10.0
  549.             ylocation = FLOAT(ylocation)/10.0
  550.             WSET, sInfo.drawWindowID
  551.             Device, COPY=[0, 0, sInfo.drawXSize, sInfo.drawYSize, 0, 0, $
  552.                 sInfo.pixmapArray(5)] 
  553.             WSET, sInfo.drawWindowID
  554.             XYOUTS, xlocation, ylocation, 'TEXT', COLOR=1, /NORMAL
  555.             WIDGET_CONTROL, sEvent.top, SET_UVALUE=sInfo, /NO_COPY
  556.  
  557.         end   ;   of  YLOCATION
  558.  
  559.         ;  Quit this application.
  560.         ;
  561.         'QUIT' : begin
  562.             WIDGET_CONTROL, sEvent.top, /DESTROY
  563.         end
  564.  
  565.         ;  Display the information text file.
  566.         ;
  567.         'ABOUT' : begin
  568.             if( Xregistered('XDisplayFile') ne 0) then RETURN
  569.             XDisplayFile, filepath("plot2d.txt", $
  570.                 SUBDIR=['examples','demo','demotext']), $
  571.                 DONE_BUTTON='Done', $
  572.                 TITLE="About 2-D plot", $
  573.                 GROUP=sEvent.top, WIDTH=55, HEIGHT=14
  574.         end           ;  of ABOUT
  575.  
  576.          
  577.         ELSE :   ;  do nothing
  578.         
  579.     endcase
  580. end
  581.  
  582. ;--------------------------------------------------------------------
  583. ;
  584. ;    PURPOSE  cleanup procedure.
  585. ;
  586. pro D_Plot2dCleanup, $
  587.     wTopBase       ; IN: top level base
  588.  
  589.     ;  Get the color table saved in the window's user value
  590.     ;
  591.     WIDGET_CONTROL, wTopBase, GET_UVALUE=sInfo,/No_Copy
  592.    
  593.     ;  Restore the previous color table.
  594.     ;
  595.     TVLCT, sInfo.colorTable
  596.  
  597.     ;  Restore the previous plot font.
  598.     ;
  599.     !P.FONT = sInfo.plotFont
  600.     
  601.     ;  Delete the pixmap
  602.     ;
  603.     for i = 0, sInfo.nPixmap-1 do begin
  604.         WDELETE, sInfo.pixmapArray(i)
  605.     endfor
  606.  
  607.     ;  Map the group leader base if it exists.
  608.     ;
  609.     if (WIDGET_INFO(sInfo.groupBase, /VALID_ID)) then $
  610.         WIDGET_CONTROL, sInfo.groupBase, /MAP
  611.  
  612. end   ; of CleanupForecast
  613.  
  614. ;--------------------------------------------------------------------
  615. ;
  616. ;   PURPOSE : Plot several 2-D plots. 
  617. ;
  618. pro D_Plot2d, $
  619.     GROUP=group, $     ; IN: (opt) group identifier
  620.     APPTLB = appTLB    ; OUT: (opt) TLB of this application
  621.  
  622.     ;  Check the validity of the group identifier.
  623.     ;
  624.     ngroup = N_ELEMENTS(group)
  625.     if (ngroup NE 0) then begin
  626.         check = widget_INFO(group, /valid)
  627.         if (check NE 1) then begin
  628.             print,'Error, the group identifier is not valid'
  629.             print, 'Return to the main application'
  630.             RETURN
  631.         endif
  632.         groupBase = group
  633.     endif else groupBase = 0L
  634.  
  635.     ;  Get the current color table. It will be restored when exiting.
  636.     ;
  637.     TVLCT, savedR, savedG, savedB, /GET
  638.     colorTable = [[savedR],[savedG],[savedB]]
  639.  
  640.     ;  Also save the font.
  641.     ;
  642.     plotFont = !P.FONT
  643.     
  644.     ;  Get the tips.
  645.     ;
  646.     sText = getTips(filepath('plot2d.tip', $
  647.         SUBDIR=['examples','demo', 'demotext']) )
  648.  
  649.     ;  Load a new color table.
  650.     ;
  651.     LOADCT, 12, /SILENT
  652.     TEK_COLOR
  653.  
  654.     ;  Use hardware-drawn font.
  655.     ;
  656.     !P.FONT=0
  657.  
  658.     ;  Determine hardware display size.
  659.     ;
  660.     DEVICE, GET_SCREEN_SIZE = screenSize 
  661.     drawXSize = 0.6 * screenSize(0)
  662.     drawYSize = 0.8 * drawXSize
  663.  
  664.     ;  Create the starting up message.
  665.     ;
  666.     if (ngroup EQ 0) then begin
  667.         drawbase = startmes()
  668.     endif else begin
  669.         drawbase = startmes(GROUP=group)
  670.     endelse
  671.  
  672.     ;  Get the character scaling factor.
  673.     ;
  674.     charscale = 8.0/!d.X_CH_SIZE
  675.     
  676.     filterLength = 32
  677.  
  678.     ;  Create the widgets.
  679.     ;
  680.     if (N_ELEMENTS(group) EQ 0) then begin
  681.         wTopBase = WIDGET_BASE(TITLE="Two Dimensional Plotting", $
  682.             /COLUMN, $
  683.             MAP=0, $
  684.             /TLB_KILL_REQUEST_EVENTS, $
  685.             TLB_FRAME_ATTR = 1, MBAR=barBase)
  686.     endif else begin
  687.         wTopBase = WIDGET_BASE(TITLE="Two Dimensional Plotting", $
  688.             GROUP_LEADER=group, $
  689.             /COLUMN, $
  690.             MAP=0, $
  691.             /TLB_KILL_REQUEST_EVENTS, $
  692.             TLB_FRAME_ATTR = 1, MBAR=barBase)
  693.     endelse
  694.  
  695.         ;  Create the menu bar items.
  696.         ;
  697.         wFileButton = WIDGET_BUTTON(barBase, VALUE='File')
  698.           
  699.             wQuitButton = WIDGET_BUTTON(wFileButton, VALUE='Quit', $
  700.                 UVALUE='QUIT')
  701.                 
  702.         wHelpButton = WIDGET_BUTTON(barBase, VALUE='About', /HELP)
  703.           
  704.             wAboutButton = WIDGET_BUTTON(wHelpButton, $
  705.                 VALUE='About 2-D Plotting', $
  706.                 UVALUE='ABOUT')
  707.                 
  708.         ;  Create the left and right bases.
  709.         ;
  710.         wTopRowBase = WIDGET_BASE(wTopBase, COLUMN=2)
  711.         
  712.             wLeftBase = WIDGET_BASE(wTopRowBase, /COLUMN)
  713.             
  714.                 wSelectButton = CW_BGROUP(wLeftBase, $
  715.                     ['Line', 'Symbols', 'Bar', $
  716.                     'Polar with Symbols', 'Log-Log', 'Semi-Log'], $
  717.                     UVALUE='SELECT', /EXCLUSIVE,/NO_RELEASE)
  718.                 
  719.                 wGenerateBase = WIDGET_BASE(wLeftBase, /COLUMN, $
  720.                     YPAD=0)
  721.                     
  722.                     wGenerateButton = WIDGET_Button(wGenerateBase, $
  723.                         VALUE='Generate New Data', UVALUE='GENERATE')
  724.                 
  725.  
  726.                 ;  Create a base for each options.
  727.                 ;
  728.                 wSelectionBase = LONARR(6)   ; 6 is the number of selections
  729.                 wTempBase = WIDGET_BASE(wLeftbase)
  730.  
  731.                     ;  Put the selection bases into the temporary (temp)
  732.                     ;  base. This way, the selection bases overlaps each
  733.                     ;  another. When the user select from wSelectButton,
  734.                     ;  only one selection base is mapped.
  735.                     ;
  736.                     for i=0, N_ELEMENTS(wSelectionbase)-1 do  begin
  737.                         wSelectionbase(i) = WIDGET_BASE(wTempBase, $
  738.                         UVALUE=0L, /COLUMN, MAP=0, YPAD=0)
  739.                     endfor
  740.  
  741.                         ;  Line plot base (for damped sine wave)  .
  742.                         ;
  743.                         wLineBase = WIDGET_BASE(wSelectionBase(0), $
  744.                             /COLUMN, /FRAME)
  745.  
  746.                             wPeriodSlider = WIDGET_SLIDER(wLineBase, $
  747.                                 MINIMUM=1, MAXIMUM=32, $
  748.                                 VALUE=8, $
  749.                                 TITLE='Period', UVALUE='PERIOD')
  750.  
  751.                         ;  Scatter plot base (Symbols).
  752.                         ;
  753.                         wSymbolBase = WIDGET_BASE(wSelectionBase(1), $
  754.                             /COLUMN, /FRAME)
  755.  
  756.                             wSub1Base = WIDGET_BASE(wSymbolBase, $
  757.                             /COLUMN)
  758.                      
  759.                                 wSymbolLabel = WIDGET_LABEL(wSub1Base, $
  760.                                     VALUE='1.0')
  761.  
  762.                                 wSymbolSlider = WIDGET_SLIDER(wSub1Base, $
  763.                                     MINIMUM=0, MAXIMUM=10, $
  764.                                     VALUE=5, /SUPPRESS_VALUE, $
  765.                                     TITLE='Variance', UVALUE='SYMBOL')
  766.  
  767.                             wSub2Base = WIDGET_BASE(wSymbolBase, $
  768.                             /COLUMN)
  769.                      
  770.                                 wSymbolList = WIDGET_LIST(wSub2Base, $
  771.                                     VALUE=['Plus sign (+)', $
  772.                                     'Asterisk (*)', $
  773.                                     'Period (.)', $
  774.                                     'Diamond' , $
  775.                                     'Triangle' , $
  776.                                     'Square'] , $
  777.                                     YSIZE=3, $
  778.                                     UVALUE='SYMBOLLIST')
  779.  
  780.                                 wListLabel = WIDGET_LABEL(wSub2Base, $
  781.                                     VALUE='Symbol selection')
  782.  
  783.  
  784.                         ;  Bar plot base (histogram).
  785.                         ;
  786.                         wBarBase = WIDGET_BASE(wSelectionBase(2), $
  787.                             /COLUMN, /FRAME)
  788.  
  789.                             wSub3Base = WIDGET_BASE(wBarBase, $
  790.                             /COLUMN, YPAD=0)
  791.                      
  792.                                 wBarLabel = WIDGET_LABEL(wSub3Base, $
  793.                                     VALUE='1.0')
  794.  
  795.                                 wBarSlider = WIDGET_SLIDER(wSub3Base, $
  796.                                     MINIMUM=0, MAXIMUM=10, $
  797.                                     VALUE=5, /SUPPRESS_VALUE, $
  798.                                     TITLE='Variance', UVALUE='BAR')
  799.  
  800.                         ;  Polar base base.
  801.                         ;
  802.                         wPolarBase = WIDGET_BASE(wSelectionBase(3), $
  803.                             /COLUMN, /FRAME)
  804.  
  805.                             wSub4Base = WIDGET_BASE(wPolarBase, $
  806.                             /COLUMN, YPAD=0)
  807.                      
  808.                                 wPolarList = WIDGET_LIST(wSub4Base, $
  809.                                     VALUE=['White', $
  810.                                     'Red', $
  811.                                     'Green', $
  812.                                     'Blue' , $
  813.                                     'Cyan' , $
  814.                                     'Magenta' , $
  815.                                     'Yellow' , $
  816.                                     'Orange'] , $
  817.                                     YSIZE=3, $
  818.                                     UVALUE='POLARLIST')
  819.  
  820.                                 wPolarLabel = WIDGET_LABEL(wSub4Base, $
  821.                                     VALUE='Color selection')
  822.  
  823.                         ;  Log-Log base.
  824.                         ;
  825.                         wLogLogBase = WIDGET_BASE(wSelectionBase(4), $
  826.                             /COLUMN, /FRAME)
  827.  
  828.                             wSub5Base = WIDGET_BASE(wLogLogBase, $
  829.                             /COLUMN, YPAD=0)
  830.  
  831.                                 wLogLogSlider = WIDGET_SLIDER(wSub5Base, $
  832.                                     MINIMUM=1, MAXIMUM=5, $
  833.                                     VALUE=3, $
  834.                                     TITLE='Thickness selection', $
  835.                                     UVALUE='THICKNESS')
  836.  
  837.                         ;  Seemi-Log base.
  838.                         ;
  839.                         wSemiLogBase = WIDGET_BASE(wSelectionBase(5), $
  840.                             /COLUMN, /FRAME)
  841.  
  842.                             wSub6Base = WIDGET_BASE(wSemiLogBase, $
  843.                             /COLUMN)
  844.  
  845.                                 wSemiLogLabel = WIDGET_LABEL(wSub6Base, $
  846.                                     VALUE='Text location')
  847.  
  848.                                 wXLocSlider = WIDGET_SLIDER(wSub6Base, $
  849.                                     MINIMUM=1, MAXIMUM=9, $
  850.                                     VALUE=3, $
  851.                                     TITLE='X', $
  852.                                     /SUPPRESS_VALUE, $
  853.                                     UVALUE='XLOCATION')
  854.  
  855.                                 wYLocSlider = WIDGET_SLIDER(wSub6Base, $
  856.                                     MINIMUM=1, MAXIMUM=9, $
  857.                                     VALUE=7, $
  858.                                     TITLE='Y', $
  859.                                     /SUPPRESS_VALUE, $
  860.                                     UVALUE='YLOCATION')
  861.  
  862.             wRightBase = WIDGET_BASE(wTopRowBase, /COLUMN)
  863.             
  864.                 wAreaDraw = WIDGET_DRAW(wRightBase, XSIZE=drawXSize, $
  865.                     YSIZE=drawYSize, RETAIN=2)
  866.         
  867.         ;  Create tips texts.
  868.         ;
  869.         wStatusBase = WIDGET_BASE(wTopBase, MAP=0, /ROW)
  870.  
  871.             nWidgets = 2
  872.             wText = LONARR(nWidgets)
  873.             widTips, wStatusBase, sText.text, XSIZE=36, $
  874.                 YSIZE=3, NWIDGETS=nWidgets, wText
  875.  
  876.     ;  Realize the widget hierarchy.
  877.     ;
  878.     WIDGET_CONTROL, wTopBase, /REALIZE
  879.  
  880.     ; Returns the top level base to the APPTLB keyword.
  881.     ;
  882.     appTLB = wtopBase
  883.  
  884.     ;  Size the tips widgets.
  885.     ;
  886.     sizeTips, wTopBase, wText, wStatusBase
  887.  
  888.     WIDGET_CONTROL, wSelectButton, SET_VALUE=0
  889.  
  890.     period = 8
  891.     WIDGET_CONTROL, wPeriodSlider, SET_VALUE=period
  892.  
  893.     WIDGET_CONTROL, wSymbolList, SET_LIST_SELECT=1
  894.     WIDGET_CONTROL, wPolarList, SET_LIST_SELECT=6
  895.  
  896.     variance = 1.0
  897.     symbol = 2     ; asterisk as symbol
  898.     
  899.     ; Determine the window value of plot window, wDraw1.
  900.     ;
  901.     WIDGET_CONTROL, wAreaDraw, GET_VALUE=drawWindowID
  902.  
  903.     ;  Create 3 pixmaps.
  904.     ;
  905.     nPixmap = 6
  906.     pixmapArray = LONARR(nPixmap)
  907.     for i = 0, nPixmap-1 do begin
  908.         Window, /FREE, XSIZE=drawXSize, YSIZE=drawYSize, /PIXMAP
  909.         pixmapArray(i) = !D.Window
  910.     endfor
  911.  
  912.     xdata = FLTARR(40)
  913.     ydata = FLTARR(40)
  914.     xLogLog = FLTARR(40)
  915.     yLogLog = FLTARR(40)
  916.     radius = FLTARR(41)
  917.     xdata(1) = 0.0
  918.     p2d_makeLine, pixmapArray(0), period
  919.     p2d_makeSymbol, pixmapArray(1), variance, symbol, X=xdata, Y=ydata
  920.     p2d_makeBar, pixmapArray(2), variance
  921.     p2d_makePolar, pixmapArray(3), COLOR=7, RADIUS=radius, /NEW ;  color is yellow
  922.     p2d_makeLogLog, pixmapArray(4), THICKNESS=3.0, $
  923.         X=xLogLog, Y=yLogLog, /NEW
  924.     p2d_makeSemiLog, pixmapArray(5)
  925.     
  926.     ;  Make the line plot the default view
  927.     ;
  928.     WSET, drawWindowID
  929.     Device, COPY=[0, 0, drawXSize, drawYSize, 0, 0, $
  930.         pixmapArray(0)]
  931.     WIDGET_CONTROL, wSelectionBase(0), MAP=1
  932.  
  933.  
  934.     
  935.     ;  Create the info structure
  936.     ;
  937.     sInfo = { $
  938.         Xdata: xdata, $                    ; X and Y data set for symbols
  939.         Ydata: ydata, $                
  940.         XLogLog: xLogLog, $                ; X and Y data set for log-log plot
  941.         YLogLog: yLogLog, $
  942.         RADIUS:radius, $                   ; Radius for polar plot
  943.         CurrentBase: wSelectionBase(0), $  ; Current selection base
  944.         DrawXSize: drawXSize, $            ; X and Y size of drawing area
  945.         DrawYSize: drawYSize, $ 
  946.         ColorTable:colorTable, $           ; Color table to restore          
  947.         CharScale: charScale, $            ; Character scaling factor
  948.         NPixmap: nPixmap, $                ; Number of pixmaps
  949.         PixmapArray: pixmapArray, $        ; Pixmap array IDs
  950.         DrawWindowID: drawWindowID, $      ; Window ID
  951.         WTopBase: wTopBase, $              ; Top level base
  952.         WSelectButton: wSelectButton, $    ; Selection button ID
  953.         WGenerateButton: wGenerateButton, $; Generate button ID
  954.         WSelectionBase: wSelectionBase, $  ; Selection base ID
  955.         WPeriodSlider: wPeriodSlider, $    ; Sliders IDs
  956.         WSymbolSlider: wSymbolSlider, $
  957.         WLogLogSlider: wLogLogSlider, $
  958.         WBarSlider: wBarSlider, $
  959.         WXLocSlider: wXLocSlider, $
  960.         WYLocSlider: wYLocSlider, $
  961.         WSymbolList: wSymbolList, $        ; Widget list Ids
  962.         WPolarList: wPolarList, $
  963.         WSymbolLabel: wSymbolLabel, $      ; Symblo label ID
  964.         WText: wText, $                    ; Widget text IDs for tips
  965.         SText: sText, $                    ; Text structure for tips
  966.         WBarLabel: wBarLabel, $            ; Bar plot label ID
  967.         plotFont: plotFont, $              ; Font to restore
  968.         groupBase: groupBase $             ; Base of Group Leader
  969.     }
  970.     
  971.     ;  Register the info structure.
  972.     ;
  973.     WIDGET_CONTROL, wTopBase, SET_UVALUE=sInfo, /NO_COPY
  974.  
  975.     ;  Desensitize the generate button at start up.
  976.     ;
  977.     WIDGET_CONTROL, wGenerateButton, SENSITIVE=0
  978.  
  979.     ;  Destroy the starting up window.
  980.     ;
  981.     WIDGET_CONTROL, drawbase, /DESTROY
  982.  
  983.     ;  Map the top level base.
  984.     ;
  985.     WIDGET_CONTROL, wTopBase, MAP=1
  986.  
  987.     ;  Register with the BIG GUY, XMANAGER!
  988.     ;
  989.     XMANAGER, "D_Plot2d", wTopBase, /NO_BLOCK, $
  990.         EVENT_HANDLER = "D_Plot2d_Event",CLEANUP="D_Plot2dCleanup"
  991.     
  992. end                      ; of D_Plot2d
  993.